#include "channel.h"

#include <sys/poll.h>
#include <sys/epoll.h>

using namespace tiny_muduo;

Channel::Channel(EventLoop* loop,
                 const int& fd__)
    : loop_(loop),
      fd_(fd__),
      events_(0),
      recv_events_(0),
      tied_(false),
      state_(kNew) {
}

Channel::~Channel(){}

void Channel::HandleEvent(){
  //从安全性上考虑，当处理事件时，如果确实有事件，应该将一个weak_ptr指针通过.lock()方法提升为一个share_ptr指针，避免在运行过程中
  //资源TCPConnection被析构。 而如果tied_未绑定资源，此时的事件是初始化事件，不管有没有指针指向直接处理也是允许的
  if(tied_){
    std::shared_ptr<void> guard=tie_.lock();
    HandleEventWithGuard();
  }else{
    HandleEventWithGuard();
  }
}

void Channel::HandleEventWithGuard() {
  if(recv_events_ & POLLNVAL){ //POLLNVAL表示事件无效
   LOG_ERROR<<"Channel::HandleEventWithGuard POLLNVAL";
  }

  if(recv_events_&(EPOLLERR|POLLNVAL)){
    if(error_callback_){
      error_callback_();
    }
  }

  if (recv_events_ & (EPOLLIN | EPOLLPRI | EPOLLRDHUP)){
    if(read_callback_){
      read_callback_();
    }
  }

  if(recv_events_&EPOLLOUT){
    if(write_callback_){
      write_callback_();
    }
  }
}
